<?php
	// 主机字节序转换为网络字节序
	// 支持8、16、32、64位的转换，注：64位，请注意在64位系统下使用，否则出错
	function htons(&$str /*IN OUT*/,$flag=4)
	{
		$str=sprintf("%s",decbin($str));
		$temp1=$str;
		$len=strlen($temp1);
		$chushu=0;
		switch($flag)
		{
		case 1:
			$chushu=$flag*8;
			if($len>$chushu)
				return false;
			break;
		case 2:
			$chushu=$flag*8;
			if($len>$chushu)
				return false;
			break;
		case 4:
			$chushu=$flag*8;
			if($len>$chushu)
				return false;
			break;
		case 8:
			$chushu=$flag*8;
			if($len>$chushu)
				return false;
			break;
		default:	
			$chushu=4*8;
			if($len>$chushu)
				return false;
		}

		//printf("old temp1 = 【%s】,old len = %d",$temp1,strlen($temp1));
		//echo "<br />\n";
		// 保存二进制的长度为其最大位数的，不足的，左侧取零
		$temp2="";
		while(($len % $chushu)!=0)
		{
			$temp2="0".$temp1;
			$temp1=$temp2;
			$len=strlen($temp1);
		}

		/*	
		printf("len = %d\ntemp1:\n",strlen($temp1));
		for($i=0;$i<$chushu;$i++)
		{
			printf("%02s ",$temp1[$i]);
			if(($i!=0)&&(($i+1)%8==0))
				printf("\n");
		}
		printf("\n");
		*/
		
		$str="";
		while($len!==0)
		{
			$temp3=substr($temp1,-8);
			$temp1=substr($temp1,0,-8);
			$len=strlen($temp1);
			$str=$str.$temp3;
			//printf("new temp3 = 【%s】,new len = %d",$temp3,strlen($temp3));
			//echo "<br />\n";
		}
		
		/*
		printf("len = %d\nstr:\n",strlen($str));
		for($i=0;$i<$chushu;$i++)
		{
			printf("%02s ",$str[$i]);
			if(($i!=0)&&(($i+1)%8==0))
				printf("\n");
		}
		printf("\n\n");
		*/

		$str=bindec($str);
		//$str=base_convert($str,2,10);
		return true;
	}

	// 网络字节序转换为主机字节序
	// 支持8、16、32、64位的转换，注：64位，请注意在64位系统下使用，否则出错
	function ntohs(&$str /*IN OUT*/,$flag=4)
	{
		$str=sprintf("%s",decbin($str));
		$temp1=$str;
		$len=strlen($temp1);
		$chushu=0;
		switch($flag)
		{
		case 1:
			$chushu=$flag*8;
			if($len>$chushu)
				return false;
			break;
		case 2:
			$chushu=$flag*8;
			if($len>$chushu)
				return false;
			break;
		case 4:
			$chushu=$flag*8;
			if($len>$chushu)
				return false;
			break;
		case 8:
			$chushu=$flag*8;
			if($len>$chushu)
				return false;
			break;
		default:	
			$chushu=4*8;
			if($len>$chushu)
				return false;
		}

		// 保存二进制的长度为其最大位数的，不足的，右侧补零
		$temp2="";
		while(($len % $chushu)!=0)
		{
			$temp2="0".$temp1;
			$temp1=$temp2;
			$len=strlen($temp1);
		}

		$str="";
		while($len!==0)
		{
			$temp3=substr($temp1,-8);
			$temp1=substr($temp1,0,-8);
			$len=strlen($temp1);
			$str=$str.$temp3;
		}

		$str=bindec($str);
		return true;
	}
?>
